공공데이터 포털에서 데이터 가져오기를 통해 입수한 데이터를 후속 시각화와 모형개발 작업을 위해 깔끔한 정제작업을 수행한다. 특히, 2020-11-06 중복된 행이 포함되어 중복 제거작업을 선행하여 처리한다.
library(tidyverse)
library(httr)
library(rvest)
library(glue)
library(lubridate)
covid_age_gender_dat <- read_rds("data/covid_age_gender.rds")
covid_age_gender_df <- covid_age_gender_dat %>%
mutate(날짜 = ymd_hms(날짜) %>% as.Date(.)) %>%
mutate(across(contains("율"), .fns = function(x) as.numeric(x) / 100)) %>%
mutate(검사자 = 확진자 / 감염율) %>%
distinct(., .keep_all = TRUE) %>% ## 2020-11-06 중복된 행이 포함되어 중복 제거작업
select(날짜, 검사자, everything())
## 성별 ----
covid_gender_df <- covid_age_gender_df %>%
filter(str_detect(구분, pattern = "(남성)|(여성)")) %>%
select(날짜, 구분, everything())
# covid_gender_df
## 연령별 ----
covid_age_df <- covid_age_gender_df %>%
filter(!str_detect(구분, pattern = "(남성)|(여성)"))
covid_age_df# A tibble: 2,332 x 7
날짜 검사자 확진자 감염율 사망자 치명율 구분
<date> <dbl> <int> <dbl> <int> <dbl> <chr>
1 2020-12-25 54718. 1844 0.0337 0 0 0-9
2 2020-12-25 54799. 3403 0.0621 0 0 10-19
3 2020-12-25 54767. 9042 0.165 0 0 20-29
4 2020-12-25 54752. 6948 0.127 3 0.0039 30-39
5 2020-12-25 54769. 7695 0.140 7 0.0091 40-49
6 2020-12-25 54773. 10248 0.187 30 0.0388 50-59
7 2020-12-25 54777. 8589 0.157 90 0.116 60-69
8 2020-12-25 54766. 4321 0.0789 227 0.294 70-79
9 2020-12-25 54806. 2680 0.0489 416 0.538 80 이상
10 2020-12-24 53482. 1797 0.0336 0 0 0-9
# ... with 2,322 more rows
본격적인 코로나19 작업을 수행하기 이전에 데이터에 대한 전반적인 이해를 높이기 위해 시각화를 한다. 이를 통해서 2020년 4월 초기 서비스를 오픈하면서 일부 기술적인 문제로 데이터가 없는 문제가 발견되어 결측값을 보정해야만 된다.
library(timetk)
covid_confirmed_g <- covid_age_df %>%
group_by(날짜) %>%
timetk::summarise_by_time(.date_var = 날짜,
.by = "day",
확진자 = sum(확진자),
검사자 = sum(검사자)) %>%
ungroup() %>%
filter(날짜 < "2020-05-01") %>%
pivot_longer(-날짜) %>%
plot_time_series(.date_var = 날짜,
.value = value,
.color_var = name,
# .facet_vars = name,
.smooth = FALSE,
.interactive = FALSE
) +
scale_colour_manual(values = c("red", "black")) +
geom_point(size = 0.5, aes(color=name)) +
scale_y_continuous(labels = scales::comma) +
scale_x_date(labels = scales::date_format(format = "%Y-%m")) +
labs(title = "코로나19 검사자와 확진자 추세")
plotly::ggplotly(covid_confirmed_g)2020-04-02 ~ 2020-04-06 사이 결측값이 있어 pad_by_time() 함수로 결측된 기간을 생성시키고 나서, ts_impute_vec() 함수로 선형보간(period = 1)을 통해 결측값을 채워넣는다.
covid_age_df <- covid_age_df %>%
group_by(날짜) %>%
timetk::summarise_by_time(.date_var = 날짜,
.by = "day",
확진자 = sum(확진자),
검사자 = sum(검사자)) %>%
ungroup() %>%
timetk::pad_by_time(.date_var = 날짜, .by = "day") %>%
mutate(확진자 = ts_impute_vec(확진자, period = 1),
검사자 = ts_impute_vec(검사자, period = 1))
covid_confirmed_clean_g <- covid_age_df %>%
group_by(날짜) %>%
timetk::summarise_by_time(.date_var = 날짜,
.by = "day",
확진자 = sum(확진자),
검사자 = sum(검사자)) %>%
ungroup() %>%
filter(날짜 < "2020-05-01") %>%
pivot_longer(-날짜) %>%
plot_time_series(.date_var = 날짜,
.value = value,
.color_var = name,
# .facet_vars = name,
.smooth = FALSE,
.interactive = FALSE
) +
scale_colour_manual(values = c("red", "black")) +
geom_point(size = 0.5, aes(color=name)) +
scale_y_continuous(labels = scales::comma) +
scale_x_date(labels = scales::date_format(format = "%Y-%m")) +
labs(title = "코로나19 검사자와 확진자 추세")
plotly::ggplotly(covid_confirmed_clean_g)데이터 정제 전략을 세웠다면 다음 단계로 데이터를 정제하여 저장시킨다.
covid_age_gender_clean_df <- covid_age_gender_df %>%
group_by(구분) %>%
timetk::pad_by_time(.date_var = 날짜, .by = "day") %>%
mutate(확진자 = ts_impute_vec(확진자, period = 1),
검사자 = ts_impute_vec(검사자, period = 1),
사망자 = ts_impute_vec(사망자, period = 1)) %>%
select(날짜, 구분, 검사자, 확진자, 사망자) %>%
ungroup
covid_age_gender_clean_df %>%
write_rds("data/covid_age_gender_clean.rds")
covid_age_gender_clean_df# A tibble: 2,949 x 5
날짜 구분 검사자 확진자 사망자
<date> <chr> <dbl> <dbl> <dbl>
1 2020-04-02 0-9 9825. 112 0
2 2020-04-03 0-9 9925. 115. 0
3 2020-04-04 0-9 10026. 118. 0
4 2020-04-05 0-9 10127. 120. 0
5 2020-04-06 0-9 10227. 123. 0
6 2020-04-07 0-9 10328. 126 0
7 2020-04-08 0-9 10413. 126 0
8 2020-04-09 0-9 10407. 128 0
9 2020-04-10 0-9 10488. 129 0
10 2020-04-11 0-9 10484. 130 0
# ... with 2,939 more rows
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com